package com.zjsru.plan2024.oneday;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 用队列实现栈
 * void push(int x) 将元素 x 压入栈顶。
 * int pop() 移除并返回栈顶元素。
 * int top() 返回栈顶元素。
 * boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。
 * @Author: cookLee
 * @Date: 2024-03-03
 */
public class MyStack {

    Queue<Integer> queue1;

    Queue<Integer> queue2;

    /**
     * 堆栈
     */
    public MyStack() {
        this.queue1 = new LinkedList<Integer>();
        this.queue2 = new LinkedList<Integer>();
    }

    /**
     * 栈是一种后进先出的数据结构，元素从顶端入栈，然后从顶端出栈。
     * 队列是一种先进先出的数据结构，元素从后端入队，然后从前端出队。
     * \
     * 为了满足栈的特性，即最后入栈的元素最先出栈,用两个队列来模拟
     * @param x x
     */
    public void push(int x) {
        this.queue2.offer(x);
        while(!queue1.isEmpty()){
            this.queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = this.queue1;
        this.queue1 = this.queue2;
        this.queue2 = temp;
    }

    /**
     * 弹出
     *
     * @return int
     */
    public int pop() {
        return this.queue1.poll();
    }

    /**
     * 顶部
     *
     * @return int
     */
    public int top() {
        return this.queue1.peek();
    }

    /**
     * 是否为空
     *
     * @return boolean
     */
    public boolean empty() {
        return this.queue1.isEmpty();
    }

}
